<?php
/*                                                                            /*

	Скрипт для сжатия загружаемых пользователем JS и CSS файлов.


	Автор:		Гринкевич Евгений Вадимович.
	Источник:	http://www.ewgenij.net/

	Надеюсь, Вам не нужно объяснять, что интеллектуальная собственность,
	это Вам не [eq собачий.

/*                                                                            */


	/* НАСТРОЙКИ */

	// Куда сохранять сжатые файлы. Поставьте права на запись для каталога.
	// Если каталога не существует, он скорее всего будет создан, если
	// ничего не перемудрить. Лучше оставить как есть сейчас.
	$sCachePath			= $_SERVER['DOCUMENT_ROOT'] . '/site/cache/jscss/';

	// 0 - не сжимать, 9 - максимальное сжатие.
	$iEncodingLevel		= 9;

	// Файлы можно кэшировать и на стороне клиента.
	// 60с. * 60м. = 3600c. = 1 час ускоренной работы сайта.
	$iExpiresOffset = 604800;

	/* ######### */

    error_reporting(0);

	$sURL = $_SERVER['REQUEST_URI'];
	$sDR  = $_SERVER['DOCUMENT_ROOT'];
	if (!file_exists($sDR . $sURL))   // Не найден исходник для кэширования.
		die();


	$sCachedName = str_replace('/', '%', $sURL);   // Новое имя в кэше
	$bGzip	= false;
	$sEnc 	= '';

	$ct = preg_match('/\.css/i', $sURL) ? 'text/css' : 'text/javascript';
	header('Content-type: ' . $ct);
	header('Vary: Accept-Encoding');
	header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $iExpiresOffset) . ' GMT');
	header('Cache-Control: max-age='.$iExpiresOffset);
    $sourceFile = $sDR . $sURL;
	$date  		= date('YmdHis', filemtime($sourceFile));
	$cacheFile 	= $sCachePath . $date . '_' . $sCachedName;

	// если указано, что браузер принимает что-то нестандартное
	if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
	{
		$sEncodings = strtolower($_SERVER['HTTP_ACCEPT_ENCODING']);
		if (strpos($sEncodings, 'gzip') !== false)
		{
			// если дальше все упакуется и не пакуется по умолчанию из-за настроек
			if (function_exists('ob_gzhandler') && !ini_get('zlib.output_compression'))
			{
				$bGzip = true;
				header('Content-Encoding: gzip');
			}
		}
	}


	if ($bGzip)
	{
		// если нет кэша (возможно из-за изменения даты модификации файла)
		if (!file_exists($cacheFile))
		{
			// удаляем возможные остатки предыдущих версий
			removeOldCache($sCachedName);
			// проверяем путь к папке кэша и пакуем
			forcePath($sCachePath);
			$cacheData = gzencode(getFileContents($sourceFile), $iEncodingLevel, FORCE_GZIP);
			putFileContents($cacheFile, $cacheData);
		}
		// отдаем запакованную версию
		echo getFileContents($cacheFile);
		die();
	}

	// если дошли до этого места, то gzip скорее всего не поддерживается
	echo getFileContents($sourceFile);



	/* Внутренние Функции */


	function removeOldCache($sFileName)
	{
		global $sCachePath;
		if ($dir = opendir($sCachePath))
		{
			while (($file = readdir($dir)) !== false)
			{
				if (strpos($file, $sFileName) !== false)
					@unlink($sCachePath . $file);
			}
		}
	}


	function getFileContents($sFile)
	{
		$sContent = '';
		$fp = @fopen($sFile, 'r');
		if (!$fp)
			return '';

		while (!feof($fp))
			$sContent .= fgets($fp);

		fclose($fp);

		return $sContent;
	}


	function putFileContents($sFile, $sContent)
	{
		$fp = @fopen($sFile, 'wb');
		if ($fp)
		{
			fwrite($fp, $sContent);
			fclose($fp);
		}
	}


    function forcePath($sPath, $chmod = 0755)
    {
		$dd = explode('/', $sPath);
		$p = ''; $r = false;
		foreach ($dd as $d) {
			$p .= $d . '/';
			$r = @mkdir($p);
			@chmod($p, $chmod);
		}
		return $r;
    }



?>